package com.lyxs916.testlibrary.rxjavatest;

import java.util.ArrayList;
import java.util.List;

import rx.Observable;
import rx.Subscriber;
import rx.functions.Action1;
import rx.functions.Func1;


/**
 * RxJava，使用演示
 */
public class TRxAndroidTest {
    /**
     * 基本的使用
     */
    public void test1() {
        //创建一个Observable对象很简单，直接调用Observable.create即可
        Observable<String> mObservable = Observable.create(
                new Observable.OnSubscribe<String>() {
                    @Override
                    public void call(Subscriber<? super String> subscriber) {
                        subscriber.onStart();
                        subscriber.onNext("123456");
                        subscriber.onNext("9999");
                        subscriber.onCompleted();
                        subscriber.onError(new Throwable("789"));


                    }
                }
        );

        Subscriber<String> mSubscriber = new Subscriber<String>() {
            @Override
            public void onStart() {
                super.onStart();
                System.out.println("onStart");
            }

            @Override
            public void onCompleted() {
                System.out.println("test1-------------onCompleted-----------");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println(e.toString());
            }

            @Override
            public void onNext(String s) {
                System.out.println(s);
            }
        };

        //这里subscriber仅仅就是打印observable发出的字符串。
        // 通过subscribe函数就可以将我们定义的myObservable对象和mySubscriber对象关联起来，
        // 这样就完成了subscriber对observable的订阅。
        mObservable.subscribe(mSubscriber);

    }

    /**
     * 简单使用
     */
    public void test2() {
        Observable<String> myObservable = Observable.just("Hello, world!");

        Action1<String> onNextAction = new Action1<String>() {
            @Override
            public void call(String s) {
                System.out.println(s);
            }
        };

        myObservable.subscribe(onNextAction);

        //subscribe方法有一个重载版本，接受三个Action1类型的参数，分别对应OnNext，OnComplete， OnError函数。
//        myObservable.subscribe(onNextAction, onErrorAction, onCompleteAction);


        //上面的代码最终可以写成这样
        Observable.just("Hello, world!22222")
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        System.out.println(s);
                    }
                });
    }


    /**
     * map的使用
     * <p>
     * 操作符（Operators）
     * 操作符就是为了解决对Observable对象的变换的问题，操作符用于在Observable和最终的Subscriber之间修改Observable发出的事件。RxJava提供了很多很有用的操作符。
     * 比如map操作符，就是用来把把一个事件转换为另一个事件的。
     */
    public void test3() {
        //创建一个Observable对象很简单，直接调用Observable.create即可
        Observable<String> mObservable = Observable.create(
                new Observable.OnSubscribe<String>() {
                    @Override
                    public void call(Subscriber<? super String> subscriber) {
                        subscriber.onStart();
                        subscriber.onNext("123456");
                        subscriber.onCompleted();
                        subscriber.onError(new Throwable("789"));


                    }
                }
        ).map(new Func1<String, String>() {
            @Override
            public String call(String s) {

                return "AAAAAAAAAAAAAAA";
            }
        }).map(new Func1<String, String>() {
            @Override
            public String call(String s) {
                return s + "BBBBBBBBBBBB";
            }
        });

        Subscriber<String> mSubscriber = new Subscriber<String>() {
            @Override
            public void onStart() {
                super.onStart();
                System.out.println("onStart");
            }

            @Override
            public void onCompleted() {
                System.out.println("test1-------------onCompleted-----------");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println(e.toString());
            }

            @Override
            public void onNext(String s) {
                System.out.println(s);
            }
        };

        //这里subscriber仅仅就是打印observable发出的字符串。
        // 通过subscribe函数就可以将我们定义的myObservable对象和mySubscriber对象关联起来，
        // 这样就完成了subscriber对observable的订阅。
        mObservable.subscribe(mSubscriber);

    }


    public void test4() {
        //1.使用for循环遍历
//        query("456").subscribe(new Subscriber<List<String>>() {
//            @Override
//            public void onCompleted() {
//
//            }
//
//            @Override
//            public void onError(Throwable e) {
//
//            }
//
//            @Override
//            public void onNext(List<String> strings) {
//                for (String s : strings) {
//                    System.out.println(s);
//                }
//            }
//        });
//

        //2.使用Observable.from(strings)循环遍历，
        // 虽然去掉了for each循环，但是代码依然看起来很乱。
        // 多个嵌套的subscription不仅看起来很丑，难以修改，更严重的是它会破坏某些我们现在还没有讲到的RxJava的特性。
//        query("132").subscribe(new Subscriber<List<String>>() {
//            @Override
//            public void onCompleted() {
//
//            }
//
//            @Override
//            public void onError(Throwable e) {
//
//            }
//
//            @Override
//            public void onNext(List<String> strings) {
//
//                Observable.from(strings).subscribe(new Subscriber<String>() {
//                    @Override
//                    public void onCompleted() {
//
//                    }
//
//                    @Override
//                    public void onError(Throwable e) {
//
//                    }
//
//                    @Override
//                    public void onNext(String s) {
//                        System.out.println(s);
//                    }
//                });
//            }
//
//        });


        //3.Observable.flatMap()接收一个Observable的输出作为输入，同时输出另外一个Observable

//        query("123").flatMap(new Func1<List<String>, Observable<String>>() {
//            @Override
//            public Observable<String> call(List<String> strings) {
//
//                return Observable.from(strings);
//            }
//        }).subscribe(new Subscriber<String>() {
//            @Override
//            public void onCompleted() {
//
//            }
//
//            @Override
//            public void onError(Throwable e) {
//
//            }
//
//            @Override
//            public void onNext(String o) {
//                System.out.println(o);
//            }
//        });


        //二次改变返回的值
        Observable ob = query("123")
                .flatMap(new Func1<List<String>, Observable<String>>() {//输出所有内容
                    @Override
                    public Observable<String> call(List<String> strings) {

                        return Observable.from(strings);
                    }
                })

                .flatMap(new Func1<String, Observable<String>>() {//输出标题
                    @Override
                    public Observable<String> call(String s) {
                        return getTitle(s);
                    }
                })
                .doOnNext(new Action1<String>() {//doOnNext()允许我们在每次输出一个元素之前做一些额外的事情
                    @Override
                    public void call(String s) {
                        System.out.println(s + "**************");
                    }
                })
                .filter(new Func1<String, Boolean>() {//getTitle()返回null如果url不存在。我们不想输出"null"，那么我们可以从返回的title列表中过滤掉null值！
                    @Override
                    public Boolean call(String s) {
                        return s != "";
                    }
                })

                .take(5)//最多输出5个
                ;

        ob.subscribe(new Subscriber<String>() {
            @Override
            public void onStart() {
                super.onStart();
                System.out.println("开始");
            }

            @Override
            public void onCompleted() {
                System.out.println("完成");
            }

            @Override
            public void onError(Throwable e) {
                e.printStackTrace();
            }

            @Override
            public void onNext(String o) {
                System.out.println(o);
            }
        });


    }

    Observable<String> getTitle(final String text) {
        return Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext(text);
                subscriber.onCompleted();
            }
        });
    }


    Observable<List<String>> query(String text) {
        final List<String> list = new ArrayList<>();
        list.add("111");
        list.add("222");
        list.add("");
        list.add("444");
        list.add("555");
        list.add("666");
        list.add("777");
        list.add("888");
        list.add("999");

        return Observable.create(new Observable.OnSubscribe<List<String>>() {
            @Override
            public void call(Subscriber<? super List<String>> subscriber) {
//                subscriber.onStart();
                subscriber.onNext(list);
                subscriber.onCompleted();
//                subscriber.onError(new Throwable("789"));
            }
        });


    }

}
